package stamboom;

import java.util.*;

public class Gezin {

   
    public static ArrayList<Gezin> gezinlist = new ArrayList<>();
    
    // *********datavelden*************************************
    private int gezinsNr;
    private Persoon ouder1;
    private Persoon ouder2;
    private ArrayList<Persoon> kinderen;
    /**
     * kan onbekend zijn
     */
    private GregorianCalendar huwelijk;
    /**
     * kan onbekend zijn; als start en scheiding beide bekend dan is scheiding
     * later dan start
     */
    private GregorianCalendar scheiding;

    // *********constructoren***********************************

    // *********constructoren***********************************
    /**
     * er wordt een (kinderloos) gezin met ouder1 en ouder2 als ouders 
     * geregistreerd; de huwelijks-(en scheidings)datum zijn onbekend (null);
     * het gezin krijgt gezinsNr als nummer;
     * dit gezin wordt ook bij bij de ouders geregistreerd
     * 
     * @param ouder1 mag niet null zijn
     * @param ouder2 ongelijk aan ouder1
     */
    public Gezin(int gezinsNr, Persoon ouder1, Persoon ouder2) {
        if (ouder1 == null) {
            throw new RuntimeException("Eerste ouder mmag niet null zijn");
        }
        if (ouder1 == ouder2) {
            throw new RuntimeException("ouders hetzelfde");
        }
        
        //if (ouder1.getGeslacht() == ouder2.getGeslacht())
        //{
        //    throw new RuntimeException("Putin does not agree!");
       // }
        
        this.gezinsNr = gezinsNr++;
        this.ouder1 = ouder1;
        this.ouder2 = ouder2;
        kinderen = new ArrayList<Persoon>();
        ouder1.wordtOuderIn(this);
        if (ouder2 != null) {
            ouder2.wordtOuderIn(this);
        }
        gezinlist.add(this);
    }
    // ********methoden*****************************************

    /**
     * @return  alle kinderen uit dit gezin
     */
    public Iterator<Persoon> getKinderen() {
        return kinderen.iterator();
    }

    public int getNr() {
        return gezinsNr;
    }

     /**
     * @return ouder1
     */
    public Persoon getOuder1() {
        return ouder1;
    }

    /**
     * @return ouder2
     */
    public Persoon getOuder2() {
        return ouder2;
    }
    
     /**
     * @return de datum van het huwelijk (kan null zijn)
     */
    public GregorianCalendar getHuwelijk() {
        return huwelijk;
    }
    /**
     * @return de datum van scheiding (kan null zijn)
     */
    public GregorianCalendar getScheiding() {
        return scheiding;
    }

    /**
     * als de ouders gehuwd zijn en nog niet gescheiden, en de als parameter 
     * gegeven datum na de huwelijksdatum ligt, wordt dit de scheidngsdatum. 
     * Anders gebeurt er niets.
     */
    public void setScheiding(GregorianCalendar datum) {
        //todo
        if(this.huwelijk !=null && this.scheiding == null && datum.after(this.huwelijk)){
            this.scheiding = datum;
        }
    }

     /**
     * registreert het huwelijk, mits de ouders nog niet gehuwd zijn
     * @param datum de huwelijksdatum
     */
    public void setHuwelijk(GregorianCalendar datum) {
        if(this.huwelijk == null){
           this.huwelijk = datum;
        }
    }

      
    /**
     * @return het nummer van de relatie, gevolgd door de namen van de twee
     * partners en de voornamen van de kinderen uit deze relatie (zie
     * voorbeeld in opgave)
     */
    @Override
    public String toString() {
        //todo
        String namenkinderen = "";
        for (Persoon p : this.kinderen){
            namenkinderen += p.getVoornamen() + ", ";
        }
        return this.gezinsNr+", "+this.ouder1.getNaam()+","+namenkinderen;
    }

    void breidUitMet(Persoon kind) {
        kinderen.add(kind);
    }
    
    	public ArrayList<PersoonUitGeneratie> stamboomgegevens(int generatie) {
		ArrayList<PersoonUitGeneratie> lijst = new ArrayList<PersoonUitGeneratie>();

                Gezin ouders;
                
                if (ouder1 != null)
                {
		lijst.add(new PersoonUitGeneratie(ouder1.getNaam()+ " (" + 
				ouder1.getGeslacht() + ") " + ouder1.getGebdat(), generatie));
		ouders = ouder1.getOuders();
		if (ouders != null)
			lijst.addAll(ouders.stamboomgegevens(generatie + 1));
                }
                
                if (ouder2 != null)
                {
                
		lijst.add(new PersoonUitGeneratie(ouder2.getNaam()+ " (" + 
				ouder2.getGeslacht() + ") "  + ouder2.getGebdat(), generatie));
		ouders = ouder2.getOuders();
		if (ouders != null)
			lijst.addAll(ouders.stamboomgegevens(generatie + 1));
                }

		return lijst;
	}
}
